/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package magic.registry;


import static common.constants.CommonConstants.CALLBACK_INSTANCES_LIMIT_KEY;
import static common.constants.CommonConstants.INTERFACE_KEY;
import static common.constants.CommonConstants.MAGIC_PROTOCOL;
import static common.constants.RpcConstants.CLUSTER_STICKY_KEY;

import com.sun.javafx.fxml.builder.URLBuilder;
import common.factory.MagicFactory;
import common.model.Exporter;
import common.model.MagicUrlBuilder;
import common.util.NetUtils;
import configcenter.zookeeper.curator.RegistryService;
import java.io.IOException;
import java.net.ServerSocket;
import protocol.Protocol;
import protocol.magic.MagicProtocol;
import proxy.ProxyFactory;
import proxy.jdk.JdkProxyFactory;

/**
 * SimpleRegistryExporter
 *
 */
public class SimpleRegistryExporter {

    private static final Protocol protocol = MagicFactory.getMagicFactory().getRemoteProtocol();

    private static final ProxyFactory PROXY_FACTORY = new JdkProxyFactory();

    public synchronized static Exporter<RegistryService> exportIfAbsent(int port) {
        try {
            new ServerSocket(port).close();
            return export(port);
        } catch (IOException e) {
            return null;
        }
    }

    public static Exporter<RegistryService> export(int port) {
        return export(port, new SimpleRegistryService());
    }

    public static Exporter<RegistryService> export(int port, RegistryService registryService) {
        return protocol.export(PROXY_FACTORY.getInvoker(registryService, RegistryService.class,
                new MagicUrlBuilder(MAGIC_PROTOCOL, NetUtils.getLocalHost(), port, RegistryService.class.getName())
                        .setPath(RegistryService.class.getName())
                        .addParameter(INTERFACE_KEY, RegistryService.class.getName())
                        .addParameter(CLUSTER_STICKY_KEY, "true")
                        .addParameter(CALLBACK_INSTANCES_LIMIT_KEY, "1000")
                        .addParameter("ondisconnect", "disconnect")
                        .addParameter("subscribe.1.callback", "true")
                        .addParameter("unsubscribe.1.callback", "false")
                        .build()));
    }

}
